package fr.ajicommerce.core.service.implementation;

import org.apache.log4j.Logger;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import fr.ajicommerce.core.dao.interfaces.ICompteClientDAO;
import fr.ajicommerce.core.dto.CompteClientDTO;
import fr.ajicommerce.core.entities.CompteClient;
import fr.ajicommerce.core.service.generics.GenericService;
import fr.ajicommerce.core.service.interfaces.CompteClientService;

@Component("compteClientServiceImpl")
@Transactional
public class CompteClientServiceImpl extends
		GenericService<CompteClientDTO, CompteClient> implements
		CompteClientService {

	private Logger log = Logger.getLogger(getClass());
	
	public CompteClientServiceImpl(Class<CompteClient> clazzOfA,
			Class<CompteClientDTO> entityClassT) {
		super(clazzOfA, entityClassT);
	}

	public CompteClientServiceImpl() {
		super(CompteClient.class, CompteClientDTO.class);
	}

	@Autowired
	ICompteClientDAO compteClientDAO;

	@Override
	public CompteClientDTO findById(Long idCompteClient) {

		// recherche de l'utilisateur par son ID
		CompteClient compteClient = compteClientDAO.find(idCompteClient);
		
		// transfert DAO --> DTO
		CompteClientDTO dto = new CompteClientDTO();
		BeanUtils.copyProperties(compteClient, dto);

		log.info("findCompteClientById --> DTO en sortie" + dto);
		return dto;
	}

	@Override
	public CompteClientDTO findByLogin(String login) {
		
		// recherche de l'utilisateur par son login
		CompteClient compteClient = compteClientDAO.findByLogin(login);
		
		CompteClientDTO dto = new CompteClientDTO();
		transfertCompteClientFromEntityToDTO(compteClient, dto);
		
		log.info("findCompteClientByLogin --> DTO en sortie" + dto);
		return dto;
	}
	
	@Override
	public CompteClientDTO findByLoginAndPassword(String login, String password) {
		
		// recherche de l'utilisateur par son login
		CompteClient compteClient = compteClientDAO.findByLoginAndPassword(login, password);
		
		CompteClientDTO dto = new CompteClientDTO();
		transfertCompteClientFromEntityToDTO(compteClient, dto);
		
		log.info("findCompteClientByLoginAndPassword --> DTO en sortie" + dto);
		return dto;
	}

	@Override
	public void save(CompteClientDTO dto) {
		
		CompteClient compteClient = new CompteClient();
		transfertCompteClientFromDTOtoEntity(dto, compteClient);
		
		compteClientDAO.save(compteClient);
		log.info("save --> CompteClient sauvegardé par le DAO : "+compteClient);
	}
	
	/**
	 * Méthode utilitaire, transfert DTO --> entité
	 * 
	 * @param dto
	 * @param entity
	 */
	private static final void transfertCompteClientFromDTOtoEntity(CompteClientDTO dto, CompteClient compteClient) {
			// DTO --> DAO
			BeanUtils.copyProperties(dto, compteClient);
			
			// ATTENTION : il faut recopier les ENUM "à la main"
			compteClient.setStatusUtilisateur(dto.getStatusUtilisateur());
			compteClient.setLangue(dto.getLangue());
			compteClient.setCivilite(dto.getCivilite());
	}
	
	private static final void transfertCompteClientFromEntityToDTO(CompteClient compteClient, CompteClientDTO dto) {
			// DAO --> DTO
			BeanUtils.copyProperties(compteClient, dto);
			
			// ATTENTION : il faut recopier les ENUM "à la main"
			dto.setStatusUtilisateur(compteClient.getStatusUtilisateur());
			dto.setLangue(compteClient.getLangue());
			dto.setCivilite(compteClient.getCivilite());
	}

}
